import tkinter as tk

# 这里使用了pygame插件，如果没有请安装
from pygame import mixer

# 正则库
import re

# 初始化
PATH = "1/1/mp3/"  # 音乐文件夹
# 音乐集合
music = {
    "欢呼掌声": "1.mp3",
    "狗叫声": "2.mp3",
    "刀剑出鞘": "3.mp3",
    "打喷嚏": "4.mp3",
    "鼓声": "5.mp3",
}
# 基本命令集
cmds = {
    "打开列表": "menu",
    "音乐列表": "menu",
    "继续": "unpause",
    "播放": "play",
    "暂停": "pause",
    "停止": "stop",
    "下一首": "next",
    "上一首": "previous",
    "大点声": "big",
    "小点声": "small",
    "静音": "muted",
    "循环播放": "loop",
    "取消循环": "one",
    "单曲播放": "one",
}
index = 0 # 当前音乐播放位置，默认第一首
loops = 0 # 默认单次播放
music_list = list(music.keys())  # 音乐列表

# 音乐列表
def menu():
    robot = "歌曲列表：\n"
    for m in music:
        robot += m + "\n"
    robot += "\n"
    tallk.insert(tk.END, robot)

# 播放音乐
def play():
    global index,loops
    name = music_list[index]
    tallk.insert(tk.END,'\n播放：'+ name) 
    mp3 = PATH + music[name]
    mixer.music.load(mp3)
    mixer.music.play(loops) 

# 暂停播放
def pause():
    mixer.music.pause()

# 继续播放
def unpause():
    mixer.music.unpause()

# 停止播放
def stop():
    mixer.music.stop()

# 下一首
def next():
    global index
    index += 1
    if index >= len(music_list):
        # 超过列表长度则重头再来
        index = 0
    play()

# 上一首
def previous():
    global index
    index -= 1
    if index < 0:
        # 小于0则播放最后一首
        index = len(music_list) - 1
    play()

# 大点声
def big():
    val = mixer.music.get_volume()
    mixer.music.set_volume(val + 0.1)
    play()

# 小点声
def small():
    val = mixer.music.get_volume()
    mixer.music.set_volume(val - 0.1)
    play()

# 静音
def muted():
    mixer.music.set_volume(0)
    play()

# 循环播放
def loop():
    global loops
    loops = -1

# 单曲播放
def one():
    global loops
    loops = 0

# 核心代码
def send():
    global loops
    # 返回命令
    cmd = input.get()
    # 判断命令
    cmd_action = cmds.get(cmd)
    if cmd_action == "menu":# 打开列表
        menu()
    elif cmd_action == "play":# 播放
        play()
    elif cmd_action == 'pause':# 暂停播放
        pause()
    elif cmd_action == 'unpause':# 继续播放
        unpause()
    elif cmd_action == 'stop':# 停止播放
        stop()
    elif cmd_action == 'next':# 下一首
        next()
    elif cmd_action == 'previous':# 上一首
        previous()  
    elif cmd_action == 'big':# 大点声
        big()
    elif cmd_action == 'small':# 小点声
        small()
    elif cmd_action == 'muted':# 静音
        muted()
    elif cmd_action == 'loop':# 循环播放
        loop()
    elif cmd_action == 'one':# 单曲播放，非循环模式
        one()
    else:# 扩展命令，这里可以再建一个命令集合
        print("其它命令")
        reg = re.compile(r'播放(\S+)')
        match = reg.match(cmd)
        if match:
            # 正则匹配 播放
            arr = match.group(1)
            if arr in music:
                mp3 = PATH + music[arr]
                mixer.music.load(mp3)
                mixer.music.play(loops)
            else:
                tallk.insert(tk.END,'\n没找到歌曲：'+ arr) 
        else:
            tallk.insert(tk.END,'\n未知命令：'+ cmd) 
  
# 初始化 pygame 的 mixer 模块
mixer.init()

# 创建主窗口
root = tk.Tk()
root.title("MP3 音乐播放器")

# 创建聊天对话框
tallk = tk.Text(root, width=50, height=14, bg="#CCB")
tallk.pack(fill=tk.BOTH, expand=True)
input = tk.Entry(root, width=45)
input.pack(side="left")
tk.Button(root, text="发送", command=send).pack(side="right")

root.mainloop()
